/*
 *  ajax请求
 *
 * @Author:  
 * @Date:   
 * @Wechat:  
 * @Email: 
 * @Copyright 
 */
import { message, Modal } from 'ant-design-vue';
import axios from 'axios';
import { useUserStore } from '/@/store/modules/system/user';
import { getToken, removeToken } from "/@/utils/storage";
import { decryptData, encryptData } from '/@/lib/encrypt';
import { DATA_TYPE_ENUM } from '/@/constants/common-const';
import _ from 'lodash';
import { XSTAGE_URL } from './url-config';
import { ApiUtil } from "/@/utils/api";
import { ObjectUtil } from "/@/lib/object";
import { getActivePinia } from 'pinia'

const errorCodeMap = new Map([
  [1, '成功！'],
  [0, '逻辑错误！'],
  [-1, '服务器错误！'],
  [-2, '记录已存在！'],
  [-3, '存在关联数据！'],
]);

// token的消息头
const TOKEN_HEADER = 'oauth';

// 创建axios对象
const packageAxios = axios.create({
  baseURL: XSTAGE_URL,
});

// 退出系统
function logout() {
  console.log(getActivePinia(), "useUserStore()");
  if (!!getActivePinia()) {
    useUserStore().logout();
  }
  removeToken();
  location.href = '/';
}

// ================================= 请求拦截器 =================================

packageAxios.interceptors.request.use(
  (config) => {
    // 在发送请求之前消息头加入token token
    const token = getToken() || useUserStore().getToken;

    if (config.noToken) return config;

    if (token) {
      config.headers[TOKEN_HEADER] = token;
      config.params[TOKEN_HEADER] = token;
    } else {
      delete config.headers[TOKEN_HEADER];
    }
    console.log(config, "config");
    return config;
  },
  (error) => {
    console.log(error, "interceptors.request-config");
    // 对请求错误做些什么
    return Promise.reject(error);
  }
);

// ================================= 响应拦截器 =================================

// 添加响应拦截器
packageAxios.interceptors.response.use(
  (response) => {
    // // 根据content-type ，判断是否为 json 数据
    // let contentType = response.headers['content-type'] ? response.headers['content-type'] : response.headers['Content-Type'];
    // if (contentType.indexOf('application/json') === -1) {
    //   return Promise.resolve(response);
    // }

    // 如果是json数据
    // if (response.data && response.data instanceof Blob) {
    //   return Promise.reject(response.data);
    // }

    // 如果是加密数据
    // if (response.data.dataType === DATA_TYPE_ENUM.ENCRYPT.value) {
    //   response.data.encryptData = response.data.data;
    //   let decryptStr = decryptData(response.data.data);
    //   if (decryptStr) {
    //     response.data.data = JSON.parse(decryptStr);
    //   }
    // }

    try {
      const data = response.data;
      const code = data.code;
      if (ApiUtil.isResponseSuccess(data)) {
        return Promise.resolve({ res: response, data });
      } else {
        // 没有权限或者登录过期
        if ([-401, 401].includes(code)) {
          console.log(code, "401");
          logout();
          return Promise.reject({ res: response, data });
        }

        data.msg = data.msg || errorCodeMap.get(code) || '';
        if (data.msg == 'Transaction rolled back because it has been marked as rollback-only') {
          response.data.msg = "系统好像迷路了，正在努力找回正轨。如果您着急，可以联系管理员，我们会第一时间为您处理!";
          data.msg = "系统好像迷路了，正在努力找回正轨。如果您着急，可以联系管理员，我们会第一时间为您处理!";
        }
        message.destroy();
        message.error(data.msg);
        return Promise.reject({ res: response, data: data });

      }
    } catch (error) {
      return Promise.reject({ res: response, data: null });
    }
  },
  (error) => {
    // 对响应错误做点什么
    // if (error.message.indexOf('timeout') !== -1) {
    //   message.destroy();
    //   message.error('网络超时');
    // } else if (error.message === 'Network Error') {
    //   message.destroy();
    //   message.error('网络连接错误');
    // } else if (error.message.indexOf('Request') !== -1) {
    //   message.destroy();
    //   message.error('网络发生错误');
    // }
    const res = error.response;
    if (ObjectUtil.hasOwnProp(res, 'status')) {
      switch (res.status) {
        case 400:
          error.message = '错误请求！';
          break;
        case 401:
        case -401:
          toLogin(false, error);
          break;
        case 403:
          error.message = '拒绝访问！';
          break;
        case 404:
          error.message = '请求错误,未找到该资源！';
          break;
        case 405:
          error.message = '请求方法未允许！';
          break;
        case 408:
          error.message = '请求超时！';
          break;
        case 500:
          error.message = '服务器端出错！';
          break;
        case 501:
          error.message = '网络未实现！';
          break;
        case 502:
          error.message = '网络错误！';
          break;
        case 503:
          error.message = '服务不可用！';
          break;
        case 504:
          error.message = '网络超时！';
          break;
        case 505:
          error.message = 'http版本不支持该请求！';
          break;
        default:
          error.message = `连接错误${error.response.status}！`;
      }
      message.destroy();
      message.error(error.message);
      return Promise.reject(error);
    }
  });

/**
 * 通用请求封装
 * @param config
 */
export const request = (config) => {
  console.log(config, "request-config");
  return packageAxios.request(config);
};